package cn.tedu.serial;

import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

public class SerialDemo {
    // 创建对象
    @Test
    public void create() {

        // 方式一：先构建后赋值
        Person p1 = new Person();
        p1.setName("Colin");
        p1.setAge(22);
        p1.setGender("male");
        p1.setAddr("北京");
        System.out.println(p1);

        // 方式二：在创建对象的时候给值
        Person p2 = new Person("Bob", 19, "male", "上海");
        System.out.println(p2);

        // 方式三：指定属性给值
        Person p3 = new Person();
        p3.put("name", "Jack");

        p3.put("age", 19);
        p3.put("gender", "male");
        p3.put("addr", "南京");
        System.out.println(p3);

        // 方式四：根据编号给值
        Person p4 = new Person();
        p4.put(0, "Rose");
        p4.put(1, 22);
        p4.put(2, "female");
        p4.put(3, "杭州");
        System.out.println(p4);

        // 方式五：利用建造者模式来创建对象
        Person p5 = Person.newBuilder()
                .setName("Mike").setAge(19).setAddr("北京").setGender("male").build();
        System.out.println(p5);

        // 方式六：建造者模式来仿照创建
        Person p6 = Person.newBuilder(p5).setName("Mark").build();
        System.out.println(p6);

    }
    // 将json转化为Person对象
    @Test
    public void jsonToPerson() {
        String json = "{\"name\": \"Jack\", \"age\": 19, \"gender\": \"male\", \"addr\": \"南京\"}";
        // 去掉引号和{}去掉
        json = json.replaceAll("\"", "");
        String[] arr = json.substring(1, json.length() - 1).split(", ");
        Person p = new Person();
        for (String s : arr) {
            String[] fs = s.split(": ");

            if (fs[1].matches("[0-9]+"))
                p.put(fs[0], Integer.parseInt(fs[1]));
            else
                p.put(fs[0], fs[1]);
        }
        System.out.println(p);
    }
    // 序列化
    @Test
    public void serial() throws IOException {
        // 创建对象
        Person p1 = new Person("David",10,"male","杭州");
        Person p2 = new Person("Kitty",12,"female","海南");
        Person p3 = new Person("hellon",15,"male","深圳");
        // 创建序列化流
        DatumWriter<Person> dw = new SpecificDatumWriter<>(Person.class);
        // 指定写出位置 创建文件流
        DataFileWriter<Person> dfw = new DataFileWriter<>(dw);
        // 指定文件
        //dfw.create(p1.getSchema(),new File("e:\\a.txt"));
        dfw.create(Person.SCHEMA$,new File("e:\\a.txt"));
        dfw.append(p1);
        dfw.append(p2);
        dfw.append(p3);
        dfw.close();
    }
    // 反序列化
    @Test
    public void deSerial() throws IOException {
        // 创建反序列化流
        DatumReader<Person> dr = new SpecificDatumReader<>(Person.class);
        // 创建文件流
        DataFileReader<Person> dfr = new DataFileReader<Person>(new File("e:\\a.txt"),dr);
        // 反序列化对象
        // 将文件流利用迭代模式来进行了包装
        while (dfr.hasNext()) {
            Person p = dfr.next();
            System.out.println(p);
        }
        //关流
        dfr.close();
    }
}
